package cn.zyq.charging.order.dao.repository.impl;

import cn.zyq.charging.order.constant.OrderStatusConstant;
import cn.zyq.charging.order.dao.mapper.OrderFailMapper;
import cn.zyq.charging.order.dao.mapper.OrderSuccessMapper;
import cn.zyq.charging.order.dao.repository.OrderRepository;
import cn.zyq.charging.order.pojo.po.ChargingBillFailPO;
import cn.zyq.charging.order.pojo.po.ChargingBillSuccessPO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

//@Repository("orderRepository") 指定名称 方便 SpringContextJobUtils通过名称来获取bean对象
@Repository("orderRepository")
public class OrderRepositoryImpl implements OrderRepository {

    @Autowired(required = false)
    private OrderSuccessMapper orderSuccessMapper;

    @Autowired(required = false)
    private OrderFailMapper orderFailMapper;

    /**
     * 正在充电的订单中途，设备异常(设备和订单之间无法继续通过心跳机制同步数据了)，然后RabbitMQ会根据配置将消息发送到死信队列。
     * ，则证明充电订单异常结束。然后由死信队列的消费端消费此消息。 在死信队列的消费端的@RabbitListener对应的方法中调用本方法
     * 将充电中的订单状态修改为充电异常结束状态。
     * 如果订单状态为充电中(1)，则修改为异常结束(3)。
     * @param orderNo
     */
    public void updateOrderStatusFromProcess2ExceptionEnd(String orderNo) {
        UpdateWrapper<ChargingBillSuccessPO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("bill_id",orderNo);
        updateWrapper.eq("bill_status", OrderStatusConstant.ORDER_STATUS_PROGRESS);
        ChargingBillSuccessPO chargingBillSuccessPO = new ChargingBillSuccessPO();
        chargingBillSuccessPO.setBillStatus(OrderStatusConstant.ORDER_STATUS_EXCEPTION_END);
        orderSuccessMapper.update(chargingBillSuccessPO,updateWrapper);
    }

    //Ctrl + u : 从实现类方法跳转到接口的方法定义处
    /**保存成功订单*/
    public void saveSuccessOrder(ChargingBillSuccessPO chargingBillSuccessPO) {
        //orderSuccessMapper.insertSuccessOrder(chargingBillSuccessPO);
        orderSuccessMapper.insert(chargingBillSuccessPO);
    }

    /**保存失败订单*///Ctrl + u : 从实现类方法跳转到接口的方法定义处
    public void saveFailOrder(ChargingBillFailPO chargingBillFailPO) {
        orderFailMapper.insert(chargingBillFailPO);
    }

    /**根据订单编号查询成功订单信息*///Ctrl + u : 从实现类方法跳转到接口的方法定义处
    public ChargingBillSuccessPO getSuccessOrderByOrderNo(String orderNo) {
        QueryWrapper<ChargingBillSuccessPO> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("bill_id",orderNo);
        return orderSuccessMapper.selectOne(queryWrapper);
    }

    /**根据订单编号查询失败订单信息*///Ctrl + u : 从实现类方法跳转到接口的方法定义处
    public ChargingBillFailPO getFailOrderByOrderNo(String orderNo) {
        QueryWrapper<ChargingBillFailPO> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("bill_id",orderNo);
        return orderFailMapper.selectOne(queryWrapper);
    }

    /**根据订单编号，修改订单对应的设备信息(充电枪id<充电枪id>)*/
    //Ctrl + u : 从实现类方法跳转到接口的方法定义处
    //本项目是在DeviceCheckJob.java中的execute()方法中的充电成功分支中，
    //根据订单id更新订单中对应的充电枪id(原本订单数据没有充电枪信息)
    public void updateOrderDeviceInfo(String orderNo, int gunId) {
        //UpdateWrapper 更新的条件
        UpdateWrapper<ChargingBillSuccessPO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("bill_id",orderNo);
        //更新的目标值
        ChargingBillSuccessPO chargingSuccessPO = new ChargingBillSuccessPO();
        chargingSuccessPO.setGunId(gunId);

        //用MyBayisPlus框架的update()： 根据updateWrapper更新条件，更新chargingSuccessPO数据
        //根据订单id更新订单中对应的充电枪id(原本订单数据没有充电枪信息)
        orderSuccessMapper.update(chargingSuccessPO, updateWrapper);
    }

}